問題解説: GitLabの意図しない挙動の調査について

こんにちは、電気通信大学 学部3年の中西建登です。
第4回はRedmine問題を出題し、問題解説を一人でやっていたのですが、
今回は運営メンバーのやる気を出すことに成功し、皆様に全ての問題に於いて問題解説を皆様にお届けしています。

今回は(今回も)OSSを用いた問題を出してみました。2日目午後に唯一出た問題として、所謂「ラスボス」という立ち位置で出題させて頂きました。
Rails系のOSS問題という事で、前回の問題文をもじって問題名を「GitLabの意図しない挙動の調査について」としてみました。前回も参加してくださった方にクスッとして頂ければなという狙いでしたが、如何だったでしょうか?(笑)

さて、ではここから問題解説をお届けします。

参加者の皆さんに公開した項目

問題文

先日、ついに弊社にも近年話題のバージョン管理システムの概念を導入し、「GitLab」と呼ばれるソフトウェアを導入した。
これは Ruby on Rails ベースで作られたオープンソースソフトウェア(OSS)であり、以下のサイトでソースコードが公開されている。

  • https://gitlab.com/gitlab-org/gitlab-ce (本家リポジトリ)
  • https://github.com/gitlabhq/gitlabhq (GitHub上に設置されたミラー)

一度弊社のエンジニアがGitLabをインストールした後、その管理を総務部の人間に任せた上で、運用をする事が社内で決定し、つい先日から運用を開始した。

さて、今日そのGitLabを見てみると、通常とは異なる挙動が発生しているようである。
本来ならGitLabのログイン画面が表示されるはずなのだが、現在は”icttoracon.net” にリダイレクトされてしまう。

このままでは仕事にならないので、何故このような現象が発生しているかを調査した上で、修正してほしい。
また、総務部が同じ操作をして間違いを繰り返さないように、何故このような現象が発生したのか、報告してほしい。

参加者が満たすべき項目

ブラウザにIPアドレスを入力し、ログイン画面が表示されるようにしてください。

問題解説

トラブルの原因

トラブルを引き起こした原因としては、「総務部のうっかり設定ミス」となっています。以下の画像を見ると、もう分かりやすいですね。



うすーく、英語で”We will redirect non-logged in users to this page”と書かれています。トラブルそのままですね。
GitLabが持っている「ログインしていないユーザのアクセスが来た場合は、そのユーザを他のサイトに転送する」という機能です。

GitLabは組織の内部のみが参照するサイトなので、外部の人がアクセスしてきたら困りますね。
検索エンジンのbotにクロールされるのも避けたい所です。その為にこのような機能が提供されています。
ただ、正規のログインユーザまでも弾いてしまうのが良くない点ではあるのですが…。

解決方法

Home Page URL の誤設定という事に気づく

前述し、問題文でも強く書きましたが、GitLabはOSS(Open Source Software)です。つまり、中身の実装が全て公開されています。

ソースコードをじっくり読み込んでみましょう。前述した2つのサイトをブラウザ上から検索するのも良いですし、慣れているコードビューワがあればそちらを使っても良いかも知れません。個人的には view コマンドが好きです。
すると、Home Page URLの設定がおかしいこと、またその設定が Admin Areaから行えるようであることがわかります。
また、これはRails内部の変数であり、PostgreSQLにその値が格納されていそうである事もわかります。

あとは、これを修正するだけですね。

PostgreSQL に接続する

今回はGitLabの中でも「GitLab Omnibus」という物を用いてインストールしました。これはGitLabで動いている複数のプロダクトをchef等を用いて管理する便利なバージョンです。
よく分からないような挙動をしているように見えますが、実際に動いているのはNginxやPostgreSQLなど、聞き馴染みのあるプロダクトばかりです。普段やっている方法で追いかけましょう。

PostgreSQLに接続するためには、 psql というコマンドを用いて接続します。しかし、皆さんにお配りしたUNIXアカウントには psql コマンドなんて入っていません。
これはミスではなく、GitLabの設計です。「最小権限の原則」に従っています。

ではどうやってPostgreSQLに接続するのでしょうか?Railsの設定を見たり、PostgreSQLの権限設定を若干変更したりする必要がありますが、最終的に、以下のようなコマンドで接続する事が可能となります。
(細かいオプションの意味などは皆さんで調べて見て下さい!)

sudo -u gitlab-psql psql -h /var/opt/gitlab/postgresql -d gitlabhq_production -U gitlab -w

gitlabhq_production=>

ここまでくれば、PostgreSQLやMySQLなどのプロダクトの違いは関係ありません。共通のSQL文を打てば、トラブルは解決出来ます。

gitlabhq_production=> select home_page_url from application_settings;
home_page_url
---------------------
http://icttoracon.net
(1 row)

gitlabhq_production=> update application_settings set home_page_url = '';
UPDATE 1
gitlabhq_production=> select home_page_url from application_settings;
home_page_url
---------------

(1 row)

あとはGitLabを再起動して、GitLabの状態を確認しましょう。きっと、GitLabのログイン画面が貴方を迎えてくれます。

出題意図

これは前回のRedmineとも共通しての事なのですが、とにかく参加者の皆さんに高レイヤーな問題を触って頂きたかったのが、この問題を出したかった意図です。
ICTトラブルシューティングコンテストはその出自よりネットワーク系の勉強をされている方が多く参加されていると聞いています。
(年々サーバ系やセキュリティ系の勉強をされている学生の参加数も増えているとも聞いています、本当に嬉しいですしありがたいです)

そんな方々に対して、このような複数プロダクトを重ね合わせて構築されている大きなプロダクトが、高いレイヤーで動いている事を知って頂きたかったです。
日々このような作業をしている方々の頭の中には、「最後はソースコードを読もう」と思う瞬間があります。今回はかなりヒント少なめだったので、約2時間じっくりとソースコードを読む良い機会になっていれば良いな…と考えています。

講評

さて、皆さんの出来に関してですが、残念ながら私を完全に納得させる回答を提出してくださったチームは居ませんでした…。
そもそもこの問題を解けたチームもあまり居なかったようです。少し難しくしすぎたかな…と反省しています。

これは全ての問題に言える事なのですが、「どのような事がトラブルの原因なのか突き止めて、どのように解決を行って、どのような結果になったのか」を明確に書くと、点数のアップに繋がります。
「なんかよく分からないけど、色々やってたら直りました」だと、それほど点数は伸びません(勿論点数は入りますが、それほど高得点とはいきません)。
少し面倒かもしれませんが、「こういうコマンドを打って直しました」「こういう結果になることを確認しました」などがコマンドの実行結果付きで書いてあると、点数の伸びがよくなるかもしれません。

余談

今回、複数台のGitLabをセットアップするために、今まで利用していたAnsibleに加えて、Seleniumという物も使ってみました。
ツチノコブログにて運営委員の森君が書いていましたが、OpenStackを導入したり、前回は(ほぼ)1人だったAnsibleチームが何人かに増えたりして、かなり柔軟にサーバを扱うことが出来ました。
サーバがサクサク立つようになったのに、問題用インスタンスのセットアップを手でやるとかイケてないよね、という事でSeleniumを導入しました。

結果として、GitLab問題の全てのインスタンスに対して、サッと問題出題準備が出来るようになりました。
GitLab問題に関しては、あと何十、何百、何千チームが参戦してきても問題はありません(笑)。

毎回毎回新しい技術にチャレンジ出来るICTトラブルシューティングコンテストの運営、皆さんも是非参加してみて下さい!